/**
 * 中间件
 * 客户请求，到服务器返回结果的流程为： 客户发起请求 --> 服务器的中间件以及自定义中间件处理 --> 路由对应的回调函数 --> 服务器将处理结果返回给客户端，所以中间件必须在路由前注册
 * 所有中间件共享同一组req,res对象，即在某个中间件中修改了req对象，那么后面的中间件也受影响
 */
const express = require('express')

app = express()

// 全局中间件，全局中间件必须用app.use注册，全局中间件的执行顺序按照注册顺序，
const g_wm1 = (req, res, next) => { // 中间件和请求的回调函数的区别就是多了next参数，next是一个函数，指向像一个被执行的中间件
    req.a = 1
    console.log('全局中间件1')
    next()  // 中间件函数的最后必须执行next()
}
const g_wm2 = (req, res, next) => {
    console.log('全局中间件2')
    next()
}
app.use(g_wm1)  // 可以直接把函数卸载app.use中
app.use(g_wm2)

// 局部中间件，不需要app.use注册的中间件函数，中间件的执行顺序是先全局中间件，再局部中间件
const jb_wm1 = (req, res, next) => {
    console.log('局部中间件1')
    next()
}
const jb_wm2 = (req, res, next) => {
    console.log('局部中间件2')
    next()
}

app.get('/', jb_wm1, jb_wm2, (req, res) => { // 局部中间件的写法还可以是app.get(url, [jb_wm1, jb_wm2], callback_func)
    res.send('get/' + req.a)
})

app.get('/user', (req, res) => {
    res.send('get/user')
})

app.listen(80, () => {
    console.log('server is at http://127.0.0.1')
})